package com.collabscm.waf.solution.persistence;

import com.collabscm.waf.vo.QueryParameters;

public interface DynamicQueryBuilder {

	/**
	 * 生成动态查询对象
	 * 
	 * @param clazz             Entity类
	 * @param namedDynamicQuery 动态查询语句的名称
	 * @param parameters        查询参数
	 * @return
	 */
	DynamicQuery buildByNamedQuery(Class<?> clazz, String namedDynamicQuery, QueryParameters parameters);

	/**
	 * 生成动态查询对象
	 * 
	 * @param clazz             Entity类
	 * @param namedDynamicQuery 动态查询语句的名称
	 * @param parameters        查询参数
	 * @return
	 */
	DynamicQuery buildByNamedNativeQuery(Class<?> clazz, String namedDynamicQuery,
			QueryParameters parameters);

	/**
	 * 根据非Native的Query创建DynamicQuery对象
	 * 
	 * @param dynamictQuery 非Native语句（JPQL）
	 * @param whereJoinType
	 * @param parameters
	 * @return
	 */
	DynamicQuery buildByDynamicQuery(String dynamicQuery, WhereJoinType whereJoinType,
			QueryParameters parameters);

	/**
	 * 根据Native的Query创建DynamicQuery对象
	 * 
	 * @param dynamicNativeQuery Native的Query语句（SQL语句）
	 * @param whereJoinType
	 * @param parameters
	 * @return
	 */
	DynamicQuery buildByDynamicNativeQuery(String dynamicNativeQuery, WhereJoinType whereJoinType,
			QueryParameters parameters);

	/**
	 * 生成动态查询对象
	 * 
	 * @param breakdown
	 * @param parameters
	 * @return
	 */
	DynamicQuery buildDynamicQuery(DynamicQueryBreakdown breakdown, QueryParameters parameters);

	/**
	 * 得到对应的解析结果
	 * 
	 * @param key key是@NamedDyanmicQuery的name，也可以是一句动态查询语句
	 */
	DynamicQueryBreakdown getDynamicQueryBreakdown(String key);

}